package com.wnxy.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class App1_jdk {
    public static void main(String[] args) {
        // 目标对象
        IOrderService orderService = new OrderServiceImpl();

        // 现在要在不修改目标对象的基础上，对目标对象进行扩展？
        // 解决方案？ 动态代理
        // 分析：目标对象有实现接口，建议使用JDK动态代理，也叫做接口代理！

        // 通过JDK提供的Api，对orderService目标对象，生产代理对象
        // 动态生成字节码：class $Proxy9 implements IOrderService
        // 接收代理对象： IOrderService proxy = $Proxy9;
        IOrderService proxy = (IOrderService) Proxy.newProxyInstance(
                App1_jdk.class.getClassLoader(),         // 指定类加载器
                orderService.getClass().getInterfaces(),   // 目标对象实现的接口类型数组
                new InvocationHandler() {// 执行事件处理程序；执行代理对象方法时候调用
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        // 获取方法名
                        String name = method.getName();
                        Object retValue = null;
                        if ("save".equals(name)) {
                            System.out.println("执行save方法才记录日志：start");
                            // 执行目标对象的方法；invoke方法的参数就是目标对象
                            retValue = method.invoke(orderService, args);
                            System.out.println("执行save方法才记录日志：start");
                        } else {
                            retValue = method.invoke(orderService, args);
                        }
                        return retValue;
                    }
                });
        // 执行代理对象的方法
        //proxy.save();
        proxy.delete(1);
        System.out.println("proxy.getClass() = " + proxy.getClass());
    }
}
